home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / email / generator.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-13  |  7KB  |  238 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. __all__ = [
  5.     'Generator',
  6.     'DecodedGenerator']
  7. import re
  8. import sys
  9. import time
  10. import random
  11. import warnings
  12. from cStringIO import StringIO
  13. from email.header import Header
  14. UNDERSCORE = '_'
  15. NL = '\n'
  16. fcre = re.compile('^From ', re.MULTILINE)
  17.  
  18. def _is8bitstring(s):
  19.     if isinstance(s, str):
  20.         
  21.         try:
  22.             unicode(s, 'us-ascii')
  23.         except UnicodeError:
  24.             return True
  25.         except:
  26.             None<EXCEPTION MATCH>UnicodeError
  27.         
  28.  
  29.     None<EXCEPTION MATCH>UnicodeError
  30.     return False
  31.  
  32.  
  33. class Generator:
  34.     
  35.     def __init__(self, outfp, mangle_from_ = True, maxheaderlen = 78):
  36.         self._fp = outfp
  37.         self._mangle_from_ = mangle_from_
  38.         self._maxheaderlen = maxheaderlen
  39.  
  40.     
  41.     def write(self, s):
  42.         self._fp.write(s)
  43.  
  44.     
  45.     def flatten(self, msg, unixfrom = False):
  46.         if unixfrom:
  47.             ufrom = msg.get_unixfrom()
  48.             if not ufrom:
  49.                 ufrom = 'From nobody ' + time.ctime(time.time())
  50.             
  51.             print >>self._fp, ufrom
  52.         
  53.         self._write(msg)
  54.  
  55.     
  56.     def clone(self, fp):
  57.         return self.__class__(fp, self._mangle_from_, self._maxheaderlen)
  58.  
  59.     
  60.     def _write(self, msg):
  61.         oldfp = self._fp
  62.         
  63.         try:
  64.             self._fp = sfp = StringIO()
  65.             self._dispatch(msg)
  66.         finally:
  67.             self._fp = oldfp
  68.  
  69.         meth = getattr(msg, '_write_headers', None)
  70.         if meth is None:
  71.             self._write_headers(msg)
  72.         else:
  73.             meth(self)
  74.         self._fp.write(sfp.getvalue())
  75.  
  76.     
  77.     def _dispatch(self, msg):
  78.         main = msg.get_content_maintype()
  79.         sub = msg.get_content_subtype()
  80.         specific = UNDERSCORE.join((main, sub)).replace('-', '_')
  81.         meth = getattr(self, '_handle_' + specific, None)
  82.         if meth is None:
  83.             generic = main.replace('-', '_')
  84.             meth = getattr(self, '_handle_' + generic, None)
  85.             if meth is None:
  86.                 meth = self._writeBody
  87.             
  88.         
  89.         meth(msg)
  90.  
  91.     
  92.     def _write_headers(self, msg):
  93.         for h, v in msg.items():
  94.             print >>self._fp, '%s:' % h,
  95.             if self._maxheaderlen == 0:
  96.                 print >>self._fp, v
  97.                 continue
  98.             if isinstance(v, Header):
  99.                 print >>self._fp, v.encode()
  100.                 continue
  101.             if _is8bitstring(v):
  102.                 print >>self._fp, v
  103.                 continue
  104.             print >>self._fp, Header(v, maxlinelen = self._maxheaderlen, header_name = h, continuation_ws = '\t').encode()
  105.         
  106.         print >>self._fp
  107.  
  108.     
  109.     def _handle_text(self, msg):
  110.         payload = msg.get_payload()
  111.         if payload is None:
  112.             return None
  113.         
  114.         if not isinstance(payload, basestring):
  115.             raise TypeError('string payload expected: %s' % type(payload))
  116.         
  117.         if self._mangle_from_:
  118.             payload = fcre.sub('>From ', payload)
  119.         
  120.         self._fp.write(payload)
  121.  
  122.     _writeBody = _handle_text
  123.     
  124.     def _handle_multipart(self, msg):
  125.         msgtexts = []
  126.         subparts = msg.get_payload()
  127.         if subparts is None:
  128.             subparts = []
  129.         elif isinstance(subparts, basestring):
  130.             self._fp.write(subparts)
  131.             return None
  132.         elif not isinstance(subparts, list):
  133.             subparts = [
  134.                 subparts]
  135.         
  136.         for part in subparts:
  137.             s = StringIO()
  138.             g = self.clone(s)
  139.             g.flatten(part, unixfrom = False)
  140.             msgtexts.append(s.getvalue())
  141.         
  142.         alltext = NL.join(msgtexts)
  143.         boundary = msg.get_boundary(failobj = _make_boundary(alltext))
  144.         if msg.get_boundary() != boundary:
  145.             msg.set_boundary(boundary)
  146.         
  147.         if msg.preamble is not None:
  148.             print >>self._fp, msg.preamble
  149.         
  150.         print >>self._fp, '--' + boundary
  151.         if msgtexts:
  152.             self._fp.write(msgtexts.pop(0))
  153.         
  154.         for body_part in msgtexts:
  155.             print >>self._fp, '\n--' + boundary
  156.             self._fp.write(body_part)
  157.         
  158.         self._fp.write('\n--' + boundary + '--')
  159.         if msg.epilogue is not None:
  160.             print >>self._fp
  161.             self._fp.write(msg.epilogue)
  162.         
  163.  
  164.     
  165.     def _handle_message_delivery_status(self, msg):
  166.         blocks = []
  167.         for part in msg.get_payload():
  168.             s = StringIO()
  169.             g = self.clone(s)
  170.             g.flatten(part, unixfrom = False)
  171.             text = s.getvalue()
  172.             lines = text.split('\n')
  173.             if lines and lines[-1] == '':
  174.                 blocks.append(NL.join(lines[:-1]))
  175.                 continue
  176.             blocks.append(text)
  177.         
  178.         self._fp.write(NL.join(blocks))
  179.  
  180.     
  181.     def _handle_message(self, msg):
  182.         s = StringIO()
  183.         g = self.clone(s)
  184.         g.flatten(msg.get_payload(0), unixfrom = False)
  185.         self._fp.write(s.getvalue())
  186.  
  187.  
  188. _FMT = '[Non-text (%(type)s) part of message omitted, filename %(filename)s]'
  189.  
  190. class DecodedGenerator(Generator):
  191.     
  192.     def __init__(self, outfp, mangle_from_ = True, maxheaderlen = 78, fmt = None):
  193.         Generator.__init__(self, outfp, mangle_from_, maxheaderlen)
  194.         if fmt is None:
  195.             self._fmt = _FMT
  196.         else:
  197.             self._fmt = fmt
  198.  
  199.     
  200.     def _dispatch(self, msg):
  201.         for part in msg.walk():
  202.             maintype = part.get_content_maintype()
  203.             if maintype == 'text':
  204.                 print >>self, part.get_payload(decode = True)
  205.                 continue
  206.             if maintype == 'multipart':
  207.                 continue
  208.             print >>self, self._fmt % {
  209.                 'type': part.get_content_type(),
  210.                 'maintype': part.get_content_maintype(),
  211.                 'subtype': part.get_content_subtype(),
  212.                 'filename': part.get_filename('[no filename]'),
  213.                 'description': part.get('Content-Description', '[no description]'),
  214.                 'encoding': part.get('Content-Transfer-Encoding', '[no encoding]') }
  215.         
  216.  
  217.  
  218. _width = len(repr(sys.maxint - 1))
  219. _fmt = '%%0%dd' % _width
  220.  
  221. def _make_boundary(text = None):
  222.     token = random.randrange(sys.maxint)
  223.     boundary = '===============' + _fmt % token + '=='
  224.     if text is None:
  225.         return boundary
  226.     
  227.     b = boundary
  228.     counter = 0
  229.     while True:
  230.         cre = re.compile('^--' + re.escape(b) + '(--)?$', re.MULTILINE)
  231.         if not cre.search(text):
  232.             break
  233.         
  234.         b = boundary + '.' + str(counter)
  235.         counter += 1
  236.     return b
  237.  
  238.